/*
 * 22JUN2011_estrut_dados.c
 *
 *  Created on: Jun 20, 2012
 *      Author: ubuntu
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct STarefa {
	int dia;
	int hora;
	char * tipo;
	char * descricao;
} Tarefa;

typedef struct sLLTarefa {
	Tarefa t;
	struct sLLTarefa * seg;
}*LLTarefa, NodoLLTarefa;

typedef struct sAgendaMensal {
	int mes;
	LLTarefa ag[31];
} AgendaMensal;

Tarefa leTarefa() {
	Tarefa * tarefa = (Tarefa*) malloc(sizeof(Tarefa));

	puts("Dia: ");
	scanf("%d", &((*tarefa).dia));
	puts("Hora: ");
	scanf("%d", &(tarefa->hora));

	// Buffer p/ leitura de descricoes
	char buffer[100];

	puts("Tipo: ");
	scanf("%s", buffer);
	tarefa->tipo = strdup(buffer);

	puts("Descrição: ");
	scanf("%s", buffer);
	tarefa->descricao = strdup(buffer);

	return *tarefa;

}

AgendaMensal pushTarefa(AgendaMensal a, Tarefa t) {

	int dia = t.dia;

	//passou a ser inútil
	//LLTarefa tarefasDodia = a.ag[dia-1];

	NodoLLTarefa * nodo = (NodoLLTarefa *) malloc(sizeof(NodoLLTarefa));

	nodo->t = t;
	nodo->seg = a.ag[dia - 1];

	a.ag[dia - 1] = nodo;

	return a;

}

int countTarefas(AgendaMensal a, int dia) {
	int conta = 0;

	LLTarefa lstTarefasAux = a.ag[dia - 1];

	while (lstTarefasAux != NULL) {
		conta++;
		lstTarefasAux = lstTarefasAux->seg;
	}
	// Ou
//	LLTarefa lstTarefasAux = NULL;
//	for (lstTarefasAux = a.ag[dia - 1]; lstTarefasAux != NULL; lstTarefasAux =
//			lstTarefasAux->seg) {
//		conta++;
//	}

	return conta;
}

AgendaMensal sortedTarefas(AgendaMensal a, Tarefa t) {

	NodoLLTarefa * nodo = (NodoLLTarefa *) malloc(sizeof(NodoLLTarefa));
	nodo->t = t;

	if (a.ag[t.dia - 1] == NULL) {
		a.ag[t.dia - 1] = nodo;
		nodo->seg = NULL;
	} else if (t.hora < a.ag[t.dia - 1]->t.hora) {
		nodo->seg = a.ag[t.dia - 1];
		a.ag[t.dia - 1] = nodo;
	} else {
//		{
//			NodoLLTarefa * nodoAux = a.ag[t.dia - 1];
//			NodoLLTarefa * nodoAnterior = NULL;
//
//			while (nodoAux != NULL && nodoAux->t.hora < t.hora) {
//				nodoAnterior = nodoAux;
//				nodoAux = nodoAux->seg;
//			}
//			nodoAnterior->seg = nodo;
//			nodo->seg = nodoAux;
//		}
		{
			NodoLLTarefa * nodoAux = a.ag[t.dia - 1];

			while (nodoAux->seg != NULL && nodoAux->seg->t.hora < t.hora) {
				nodoAux = nodoAux->seg;
			}
			nodo->seg = nodoAux->seg;
			nodoAux->seg = nodo;

		}
	}

	return a;
}

void listarTarefas(AgendaMensal a, int dia) {

	NodoLLTarefa * nodoDia = a.ag[dia - 1];

	while (nodoDia != NULL) {
		printf("Hora: %d ", (*nodoDia).t.hora);
		printf("Tipo: %s ", nodoDia->t.tipo);
		printf("Descriçao: %s\n", nodoDia->t.descricao);

		nodoDia = nodoDia->seg;

	}

}

int main(int argc, char **argv) {
	Tarefa t = leTarefa();

	printf("Info: %d %d %s %s\n", t.dia, t.hora, t.tipo, t.descricao);

	AgendaMensal * agendaMensal = (AgendaMensal*) malloc(sizeof(AgendaMensal));
	agendaMensal->mes = 6;
	int i = 0;
	for (i = 0; i < 31; i++) {
		agendaMensal->ag[i] = NULL;
	}

	printf("Conta nr tarefas Antes %d\n", countTarefas(*agendaMensal, t.dia));
	*agendaMensal = sortedTarefas(*agendaMensal, t);
	printf("Conta nr tarefas Depois %d\n", countTarefas(*agendaMensal, t.dia));

	listarTarefas(*agendaMensal, t.dia);

	Tarefa t2 = leTarefa();
	*agendaMensal = sortedTarefas(*agendaMensal, t2);
	listarTarefas(*agendaMensal, t.dia);

	Tarefa t3 = leTarefa();
	*agendaMensal = sortedTarefas(*agendaMensal, t3);
	listarTarefas(*agendaMensal, t.dia);

	return 0;
}
